#!/usr/bin/env python
# -*- coding: utf-8 -*-

# This file is part of Beremiz, a Integrated Development Environment for
# programming IEC 61131-3 automates supporting plcopen standard and CanFestival.
#
# Copyright (C) 2007: Edouard TISSERANT and Laurent BESSARD
# Copyright (C) 2017: Andrey Skvortsov
#
# See COPYING file for copyrights details.
#
# This program is free software; you can redistribute it and/or
# modify it under the terms of the GNU General Public License
# as published by the Free Software Foundation; either version 2
# of the License, or (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.

# Package initialisation


"""
Beremiz Targets

- Target are python packages, containing at least one "XSD" file
- Target class may inherit from a toolchain_(toolchainname)
- The target folder's name must match to name define in the XSD for TargetType
"""
import os
from os import listdir, path

from .Generic import Generic_target
from .Linux import Linux_target
from .SYLIXOS_ARM import SYLIXOS_ARM_target
from .SYLIXOS_LOONG2K import SYLIXOS_LOONG2K_target
from .SYLIXOS_X86 import SYLIXOS_X86_target
from .Win32 import Win32_target
from .Win32_pio import Win32_pio_target
from .Xenomai import Xenomai_target
from .__Linux_ARM import Linux_ARM_target
from .__Xenomai_ARM import Xenomai_ARM_target
from .__Xenomai_ARM_GMC import Xenomai_ARM_GMC_target
from .__catkin import catkin_target
from .platformio import pio_target

_base_path = os.path.dirname(__file__)

t_target = {
    'Generic': Generic_target,
    'Linux': Linux_target,
    'Win32': Win32_target,
    'Xenomai': Xenomai_target,
    '__catkin': catkin_target,
    '__Linux_ARM': Linux_ARM_target,
    'platformio': pio_target,
    'SYLIXOS_ARM': SYLIXOS_ARM_target,
    'SYLIXOS_LOONG2K': SYLIXOS_LOONG2K_target,
    'SYLIXOS_X86': SYLIXOS_X86_target,
    'Win32_pio': Win32_pio_target,
    '__Xenomai_ARM': Xenomai_ARM_target,
    '__Xenomai_ARM_GMC': Xenomai_ARM_GMC_target
}


def _GetLocalTargetClassFactory(name):
    return t_target[name]


targets = dict([(name, {"xsd": path.join(_base_path, name, "XSD"),
                        "class": _GetLocalTargetClassFactory(name),
                        "code": {fname: path.join(_base_path, name, fname)
                                 for fname in listdir(path.join(_base_path, name))
                                 }})
                for name in listdir(_base_path)
                if (path.isdir(path.join(_base_path, name)) and
                    not name.startswith("__"))])

toolchains = {"gcc": path.join(_base_path, "XSD_toolchain_gcc"),
              "makefile": path.join(_base_path, "XSD_toolchain_makefile"),
              "platformio": path.join(_base_path, "XSD_toolchain_platformio")}


def GetBuilder(targetname):
    return targets[targetname]["class"]


def GetTargetChoices():
    DictXSD_toolchain = {}
    targetchoices = ""

    # Get all xsd toolchains
    for toolchainname, xsdfilename in toolchains.items():
        if path.isfile(xsdfilename):
            with open(xsdfilename) as f:
                DictXSD_toolchain["toolchain_" + toolchainname] = f.read()

    # Get all xsd targets
    for target_name, nfo in targets.items():
        with open(nfo["xsd"]) as f:
            xsd_string = f.read()
            targetchoices += xsd_string % dict(DictXSD_toolchain,
                                               target_name=target_name)

    return targetchoices


def GetTargetCode(targetname):
    codedesc = targets[targetname]["code"]
    code = "\n".join([open(fpath).read() for _fname, fpath in sorted(codedesc.items())])
    return code


def GetHeader():
    filename = os.path.join(os.path.dirname(__file__), "beremiz")
    return open(filename).read()


def GetCode(name):
    filename = os.path.join(os.path.dirname(__file__), name)
    return open(filename).read()
